/**
 * MCU GPIO 驱动适配层
 * Copyright (c) 2021 深圳市智辰科技有限公司
 * All rights reserved.
 */

#include <driver/gpio.h>

#include "stdc.h"
#include "gpio.h"


/**
 * 参数版 gpio_config()
 */
std_err_t GPIO_Config(gpio_num_t pin, gpio_mode_t mode, gpio_pullup_t pull_up_en, gpio_pulldown_t pull_down_en, gpio_int_type_t intr_type) {
    gpio_config_t cfg = {
        .pin_bit_mask   = (1ULL<<pin),
        .mode           = mode,
        .pull_up_en     = pull_up_en,
        .pull_down_en   = pull_down_en,
        .intr_type      = intr_type
    };
    return gpio_config(&cfg);
}

std_err_t GPIO_ConfigX(gpio_num_t pin, gpio_modex_t mode, gpio_int_type_t intr) {
	if(mode == GPIO_MODEX_NULL)  { return GPIO_Config(pin, GPIO_MODE_DISABLE,   GPIO_PULLUP_DISABLE, GPIO_PULLDOWN_DISABLE, intr); }
	if(mode == GPIO_MODEX_IPU)   { return GPIO_Config(pin, GPIO_MODE_INPUT,     GPIO_PULLUP_ENABLE,  GPIO_PULLDOWN_DISABLE, intr); }
	if(mode == GPIO_MODEX_IPD)   { return GPIO_Config(pin, GPIO_MODE_INPUT,     GPIO_PULLUP_DISABLE, GPIO_PULLDOWN_ENABLE,  intr); }
	if(mode == GPIO_MODEX_OPPL)  { return GPIO_Config(pin, GPIO_MODE_OUTPUT,    GPIO_PULLUP_ENABLE,  GPIO_PULLDOWN_ENABLE,  intr) | gpio_set_level(pin, 0); }
	if(mode == GPIO_MODEX_OPPH)  { return GPIO_Config(pin, GPIO_MODE_OUTPUT,    GPIO_PULLUP_ENABLE,  GPIO_PULLDOWN_ENABLE,  intr) | gpio_set_level(pin, 1); }
	if(mode == GPIO_MODEX_OODL)  { return GPIO_Config(pin, GPIO_MODE_OUTPUT_OD, GPIO_PULLUP_DISABLE, GPIO_PULLDOWN_DISABLE, intr) | gpio_set_level(pin, 0); }
	if(mode == GPIO_MODEX_OODH)  { return GPIO_Config(pin, GPIO_MODE_OUTPUT_OD, GPIO_PULLUP_DISABLE, GPIO_PULLDOWN_DISABLE, intr) | gpio_set_level(pin, 1); }
	return STD_ERR_INVALID_ARG;
}
